#ifndef BLOCK_H
#define BLOCK_H

#include <QObject>

/**
 * 俄罗斯方块 方块类
 * @brief The Block class
 */
class Block : public QObject
{
    Q_OBJECT
public:
    //方块的类型（共7种）1,2,3,4,5,6,7    I, J, L, O, S, T, Z
    enum BlockType{I=1, J, L, O, S, T, Z};
    //变形 左(初始),上(顺时针旋转90度),右(顺时针旋转180度),下(顺时针旋转270度)
    enum Variant{LEFT, UP, RIGHT, DOWN};
    //二维数组 表示方块的形状
    int block[4][4] = {{0}};
    int x = 0, y = 0;//坐标 控制位置 相对于0,0坐标的x轴上的偏移量，y轴上的偏移量,单位是一个网格的大小


    /**
     * 构造函数 创建一个对象
     * @brief Block
     * @param blockType 类型
     * @param subType 变形
     * @param parent
     */
    explicit Block(BlockType blockType, Variant subType = Variant::LEFT, QObject *parent = nullptr);
    virtual ~Block()override;

    /**
     * 设置(根据不同的类型改变数组中的值创建不同的形状)
     * @brief setType
     * @param blockType
     * @param subType
     */
    void setType(BlockType blockType, Variant subType);

    /**
     * 创建设置的形状类型
     * @brief createType
     */
    void createType();

    /**
     * 重置,所有位置设置为0
     * @brief reSet
     */
    void reSet();

    /**
     * 变形
     * @brief change
     */
    void change();

    /**
     * 将其他方块的形状复制过来
     * @brief copy
     * @param block
     */
    void copy(Block & block);

signals:
public slots:
private:
    //方块的类型
    BlockType type = BlockType::I;
    //变形类型（每种类型的有4个方向的变形）1,2,3,4(按顺时针方向旋转)
    Variant subType = Variant::LEFT;

    //根据类型设置数组的值
    void createTypeI();
    void createTypeJ();
    void createTypeL();
    void createTypeO();
    void createTypeS();
    void createTypeT();
    void createTypeZ();
};

#endif // BLOCK_H
